package com.xiaotu.core.utils;


import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * 测试List中
 * ArrayList和LinkdList的区别
 * @author 平步青云
 */
public class ListTest {
	/**
	 * 1.ArrayList底层为数组实现，LinkedList底层为双向链表实现。ArrayList只能作为列表使用，LinkedList还能作为队列，因为实现了Deque接口。
	 2.LinkedList在数组中的开销更大，因为它不仅需要存储元素，还需要保存前后结点的地址，而ArrayList更加轻量级。
	 3. 在插入和删除效率上，理论上LinkedList优于ArrayList，但这还与数据量与处理的位置有关系，但查询的效率上ArrayList更占有优势
	 */
	public static void main(String[] args) {
		System.out.println("两者查找速度比较");
		findNumTest();
//		System.out.println("头部插入耗时比较");
//		TestFirstList();
//		System.out.println("尾部插入耗时比较");
//		TestLastList();
	}
	/*测试头部插入数据*/
	public static void TestFirstList() {
		List<Long> arrayList = new ArrayList<>();
		List<Long> linkedList = new LinkedList<>();
		long startTime = System.currentTimeMillis();
		//对arrayList插入数据
		for(Long i = 0L;i<1000000;i++) {
			arrayList.add(0, i);
		}
		long endTime = System.currentTimeMillis();
		System.out.println("ArrayList总耗时=========>"+(endTime-startTime));
		arrayList.clear();
		startTime = System.currentTimeMillis();
		//对linkedList插入数据
		for(Long i = 0L;i<1000000;i++) {
			linkedList.add(0,  i);
		}
		endTime = System.currentTimeMillis();
		System.out.println("LinkedList总耗时=========>"+(endTime-startTime));
		linkedList.clear();
	}
	/*测试按顺序从尾部插入数据*/
	public static void TestLastList() {
		List<Long> arrayList = new ArrayList<>();
		List<Long> linkedList = new LinkedList<>();
		long startTime = System.currentTimeMillis();
		//对arrayList插入数据
		for(Long i = 0L;i<1000000;i++) {
			arrayList.add(i);
		}
		long endTime = System.currentTimeMillis();
		System.out.println("ArrayList总耗时=========>"+(endTime-startTime));
		arrayList.clear();
		startTime = System.currentTimeMillis();
		//对linkedList插入数据
		for(Long i = 0L;i<1000000;i++) {
			linkedList.add(i);
		}
		endTime = System.currentTimeMillis();
		System.out.println("LinkedList总耗时=========>"+(endTime-startTime));
		linkedList.clear();
	}
	/*数据查找比较*/
	public static void findNumTest() {
		List<Long> arrayList = new ArrayList<>();
		List<Long> linkedList = new LinkedList<>();
		//对arrayList插入数据
		for(Long i = 0L;i<100000;i++) {
			arrayList.add(i);
			linkedList.add(i);
		}
		long startTime = System.currentTimeMillis();
		for(int i = 0;i<arrayList.size();i++){
			arrayList.get(i);
		}
		long endTime = System.currentTimeMillis();
		System.out.println("ArrayList查找速度为==========>"+(endTime-startTime));
		startTime = System.currentTimeMillis();
		for(int i = 0;i<arrayList.size();i++){
			linkedList.get(i);
		}
		endTime = System.currentTimeMillis();
		System.out.println("LinkedList查找速度为==========>"+(endTime-startTime));
		arrayList.clear();
		linkedList.clear();
	}
}
